package  main.java.leetcode.editor.cn;
//2023-03-08 17:23:21
//请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。 
//
// 数值（按顺序）可以分成以下几个部分： 
//
// 
// 若干空格 
// 一个 小数 或者 整数 
// （可选）一个 'e' 或 'E' ，后面跟着一个 整数 
// 若干空格 
// 
//
// 小数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 下述格式之一：
// 
// 至少一位数字，后面跟着一个点 '.' 
// 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字 
// 一个点 '.' ，后面跟着至少一位数字 
// 
// 
// 
//
// 整数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 至少一位数字 
// 
//
// 部分数值列举如下： 
//
// 
// ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"] 
// 
//
// 部分非数值列举如下： 
//
// 
// ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"] 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "0"
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：s = "e"
//输出：false
// 
//
// 示例 3： 
//
// 
//输入：s = "."
//输出：false 
//
// 示例 4： 
//
// 
//输入：s = "    .1  "
//输出：true
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 20 
// s 仅含英文字母（大写和小写），数字（0-9），加号 '+' ，减号 '-' ，空格 ' ' 或者点 '.' 。 
// 
// Related Topics 字符串 👍 432 👎 0

class BiaoShiShuZhiDeZiFuChuanLcof {
    public static void main(String[] args) {
        //创建该题目的对象方便调用
        Solution solution = new BiaoShiShuZhiDeZiFuChuanLcof().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean isNumber(String s) {
        char[] charArray = s.toCharArray();
        int n = charArray.length;

        int index = 0;  //下标

        boolean hasNum = false;
        boolean hasE = false;
        boolean hasSign = false;
        boolean hasDot = false;

        //移动到非空白处
        while (index<n && charArray[index] == ' '){
            index++;
        }

        while (index < n){
            char c = charArray[index];

            if (c >= '0' && c<='9'){
                hasNum = true;
            }else if (c == 'e' || c == 'E'){
                if (hasE || !hasNum){
                    return false;      //先出现了e/E
                }
                hasE = true;
                hasNum = false;
                hasSign = false;
                hasDot = false;
            }else if (c == '+' || c == '-'){
                if (hasNum || hasDot || hasSign){
                    return false;
                }
                hasSign = true;
            }else if (c == '.'){
                if (hasDot || hasE){
                    return false;
                }
                hasDot = true;
            }else if (c == ' '){
                break;
            }else {
                return false;
            }
            index++;
        }
        for(;index<n;index++){
            if (charArray[index] != ' '){
                return false;
            }
        }
        return hasNum;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
